package qldc.pm.tienan.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.jfree.util.Log;

import qldc.pm.qtht.dmdc.service.PhuongXaLocalServiceUtil;
import qldc.pm.qtht.dmdc.service.QuanHuyenLocalServiceUtil;
import qldc.pm.tienan.NoSuchLichSuXoaAnTichException;
import qldc.pm.tienan.NoSuchTienAnException;
import qldc.pm.tienan.constants.TrangThaiTienAnEnum;
import qldc.pm.tienan.dto.ThongKeTienAnDTO;
import qldc.pm.tienan.model.DoiTuongTienAn;
import qldc.pm.tienan.model.LichSuXoaAnTich;
import qldc.pm.tienan.model.PhieuThongTinVeNguoiCoTienAn;
import qldc.pm.tienan.model.TEMP_DoiTuongTienAn;
import qldc.pm.tienan.model.TEMP_TienAn;
import qldc.pm.tienan.model.TienAn;
import qldc.pm.tienan.service.DoiTuongTienAnLocalServiceUtil;
import qldc.pm.tienan.service.LichSuXoaAnTichLocalServiceUtil;
import qldc.pm.tienan.service.TienAnLocalServiceUtil;
import qldc.pm.tienan.service.base.TienAnLocalServiceBaseImpl;
import qldc.pm.tienan.service.persistence.TienAnFinderUtil;

import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.model.User;

/**
 * The implementation of the tien an local service.
 *
 * <p>
 * All custom service methods should be put in this class. Whenever methods are
 * added, rerun ServiceBuilder to copy their definitions into the
 * {@link qldc.pm.tienan.service.TienAnLocalService} interface.
 *
 * <p>
 * This is a local service. Methods of this service will not have security
 * checks based on the propagated JAAS credentials because this service can only
 * be accessed from within the same VM.
 * </p>
 *
 * @author Brian Wing Shun Chan
 * @see qldc.pm.tienan.service.base.TienAnLocalServiceBaseImpl
 * @see qldc.pm.tienan.service.TienAnLocalServiceUtil
 */
public class TienAnLocalServiceImpl extends TienAnLocalServiceBaseImpl {
	public TienAn addTienAn(User user, long doiTuongTienAnId, String banAnSo,
			String toaAnXuPhat, String diaChiToaAnXuPhat, Date ngayToaAn,
			String toiDanh, Date ngayPhamToi, boolean xoaAnTich,
			String chuThich, String hinhPhatChinh, String hinhPhatBoSung,
			String nghiaVuDanSu, String anPhi, String moTaTienAn)
			throws SystemException {
		long tienAnId = counterLocalService.increment(TienAn.class.getName());
		TienAn tienAn = createTienAn(tienAnId);

		tienAn.setUserId(user.getUserId());
		tienAn.setUserName(user.getScreenName());
		tienAn.setCreateDate(new Date());
		tienAn.setDoiTuongTienAnId(doiTuongTienAnId);
		tienAn.setToaAnXuPhat(toaAnXuPhat);
		tienAn.setMoTaTienAn(moTaTienAn);
		tienAn.setNgayToaAn(ngayToaAn);
		tienAn.setNgayPhamToi(ngayPhamToi);
		tienAn.setToiDanh(toiDanh);
		tienAn.setXoaAnTich(xoaAnTich);
		tienAn.setChuThich(chuThich);
		tienAn.setHinhPhatChinh(hinhPhatChinh);
		tienAn.setHinhPhatBoSung(hinhPhatBoSung);
		tienAn.setNghiaVuDanSu(nghiaVuDanSu);
		tienAn.setAnPhi(anPhi);
		tienAn.setBanAnSo(banAnSo);
		tienAn = addTienAn(tienAn);

		return tienAn;
	}

	public TienAn updateTienAn(long tienAnId, User user, long doiTuongTienAnId,
			String banAnSo, String toaAnXuPhat, String diaChiToaAnXuPhat,
			Date ngayToaAn, String toiDanh, Date ngayPhamToi,
			boolean xoaAnTich, String chuThich, String hinhPhatChinh,
			String hinhPhatBoSung, String nghiaVuDanSu, String anPhi, String moTaTienAn)
			throws SystemException, PortalException {
		TienAn tienAn = getTienAn(tienAnId);

		tienAn.setUserId(user.getUserId());
		tienAn.setUserName(user.getScreenName());
		tienAn.setModifiedDate(new Date());
		tienAn.setDoiTuongTienAnId(doiTuongTienAnId);
		tienAn.setToaAnXuPhat(toaAnXuPhat);
		// tienAn.setDiaChiToaAnXuPhat(diaChiToaAnXuPhat);
		tienAn.setNgayToaAn(ngayToaAn);
		tienAn.setNgayPhamToi(ngayPhamToi);
		tienAn.setToiDanh(toiDanh);
		tienAn.setXoaAnTich(xoaAnTich);
		tienAn.setChuThich(chuThich);
		tienAn.setHinhPhatChinh(hinhPhatChinh);
		tienAn.setHinhPhatBoSung(hinhPhatBoSung);
		tienAn.setNghiaVuDanSu(nghiaVuDanSu);
		tienAn.setAnPhi(anPhi);
		tienAn.setBanAnSo(banAnSo);
		tienAn.setMoTaTienAn(moTaTienAn);

		tienAn = updateTienAn(tienAn);

		return tienAn;
	}

	public TienAn updateXoaAnTich(User user, long tienAnId, boolean val)
			throws SystemException, PortalException {
		TienAn tienAn = getTienAn(tienAnId);

		tienAn.setUserId(user.getUserId());
		tienAn.setUserName(user.getScreenName());
		tienAn.setModifiedDate(new Date());
		tienAn.setXoaAnTich(val);

		tienAn = updateTienAn(tienAn);
		DoiTuongTienAn doiTuong = DoiTuongTienAnLocalServiceUtil
				.findByDoiTuongTienAnId(tienAn.getDoiTuongTienAnId());
		if (Validator.isNotNull(doiTuong)) {
			TienAn tienAnDangThiHanh = DoiTuongTienAnLocalServiceUtil
					.layTienAnDangThiHanhAnCuaDoiTuong(doiTuong
							.getSoDinhDanhCaNhan());
			if (Validator.isNull(tienAnDangThiHanh)) {
				// Ko con tien an
				doiTuong.setXoaAnTich(true);
				doiTuongTienAnPersistence.update(doiTuong);
			}

		}

		return tienAn;
	}

	public TrangThaiTienAnEnum kiemTraTrangThaiCuaTienAn(long tienAnId)
			throws NoSuchLichSuXoaAnTichException, SystemException {
		TienAn ts = TienAnLocalServiceUtil.findByTienAnId(tienAnId);
		if (Validator.isNotNull(ts)) {
			if (ts.getXoaAnTich()) {
				return TrangThaiTienAnEnum.DA_XOA_AN_TICH;
			} else {
				LichSuXoaAnTich lsx = LichSuXoaAnTichLocalServiceUtil
						.findByTienAnId(tienAnId);
				if (Validator.isNotNull(lsx)) {
					return TrangThaiTienAnEnum.DANG_LAP_YEU_CAU_XOA_AN_TICH;
				} else {
					return TrangThaiTienAnEnum.DANG_THI_HANH_AN;
				}
			}

		}
		return TrangThaiTienAnEnum.DANG_THI_HANH_AN;
	}

	public List<TienAn> findByDoiTuongTienAnId(long doiTuongTienAnId) {
		List<TienAn> tienAns = new ArrayList<TienAn>();

		try {
			tienAns = tienAnPersistence
					.findByDoiTuongTienAnId(doiTuongTienAnId);
		} catch (SystemException e) {
		}

		return tienAns;
	}

	public TienAn findByDoiTuongTienAnId_Latest(long doiTuongTienAnId) {
		TienAn tienAn = null;

		try {
			List<TienAn> tienAns = tienAnPersistence
					.findByDoiTuongTienAnId(doiTuongTienAnId);

			if (Validator.isNotNull(tienAns) && !tienAns.isEmpty()) {
				tienAn = tienAns.get(0);
			}
		} catch (SystemException e) {
		}

		return tienAn;
	}

	public int countByDoiTuongTienAnId(long doiTuongTienAnId)
			throws SystemException {
		return tienAnPersistence.countByDoiTuongTienAnId(doiTuongTienAnId);
	}

	public TienAn findByTienAnId(long tienAnId) {
		TienAn tienAn = null;

		try {
			tienAn = tienAnPersistence.findByPrimaryKey(tienAnId);
		} catch (NoSuchTienAnException e) {
		} catch (SystemException e) {
		}

		return tienAn;
	}

	@SuppressWarnings("null")
	public List<ThongKeTienAnDTO> thongKeTienAnTongQuat(long tinhId,
			long quanHuyenId, Date tuNgay, Date denNgay) {

		List<Object[]> objList;
		try {
			if (quanHuyenId == 0) {
				// If user only select TinhId

				objList = TienAnFinderUtil.findByTKTS_Diaphuong_QuanHuyen(
						tinhId, tuNgay, denNgay);

				return fetchThongKeTienAn(objList, tinhId, quanHuyenId, tuNgay, denNgay);

			} else {
				objList = TienAnFinderUtil.findByTKTS_Diaphuong_PhuongXa(
						tinhId, quanHuyenId, tuNgay, denNgay);

				return fetchThongKeTienAn(objList, tinhId, quanHuyenId, tuNgay, denNgay);

			}

		} catch (SystemException e) {
			e.printStackTrace();
		}
		return null;


	}

	private List<ThongKeTienAnDTO> fetchThongKeTienAn(List<Object[]> objList,
			long tinhId, long quanHuyenId, Date tuNgay, Date denNgay) {
		List<ThongKeTienAnDTO> dsThongKe = new ArrayList<ThongKeTienAnDTO>();
		long quanHuyen = 0, phuongXa = 0;

		try {

			for (int i = 0; i < objList.size(); i++) {
				Object[] obj = objList.get(i);
				ThongKeTienAnDTO thongKe = new ThongKeTienAnDTO();
				thongKe.setIndex(i);
				int hanhChinhId = Integer.valueOf(obj[0].toString());
				String tenHanhChinh;
				if (quanHuyenId <= 0) {
					tenHanhChinh = QuanHuyenLocalServiceUtil.findById(
							hanhChinhId).getTenQuanHuyen();
					quanHuyen = hanhChinhId;
					phuongXa = -1;
				} else {
					tenHanhChinh = PhuongXaLocalServiceUtil.findById(
							hanhChinhId).getTenPhuongXa();
					quanHuyen = quanHuyenId;
					phuongXa = hanhChinhId;
				}
				thongKe.setDonViHanhChinh(tenHanhChinh);
				thongKe.setHoKhau(Integer.valueOf(obj[1].toString()));
				thongKe.setNhanKhau(Integer.valueOf(obj[2].toString()));

				int hoCoTienAn = doiTuongTienAnFinder
						.countDSHoGiaDinhByVungDiaLy_ThoiGianToaAn(tinhId,
								quanHuyen, phuongXa, tuNgay, denNgay);
				int xoaAnTich = doiTuongTienAnFinder.countByDS_XoaAnTich(
						tinhId, quanHuyen, phuongXa, tuNgay, denNgay);
				int trichLuc = ketQuaTrichLucFinder.countDS_TrichLuc(tinhId,
						quanHuyen, phuongXa, tuNgay, denNgay, null, null);
				int tienAn = doiTuongTienAnFinder
						.countDsTienAnByVungDiaLy_ThoiGian(tinhId, quanHuyen,
								phuongXa, tuNgay, denNgay, 1);

				thongKe.setTienAn(tienAn);
				thongKe.setXoaAnTich(xoaAnTich);
				thongKe.setTongHoCoTienAn(hoCoTienAn);
				thongKe.setTrichLuc(trichLuc);
				dsThongKe.add(thongKe);
			}
		} catch (Exception e) {
				Log.error(e.getMessage());
		}

		return dsThongKe;
	}

	public void xoaTienAn(long tienAnId, String undoRedo, String thaoTac, User user) throws PortalException, SystemException {
		TienAn tienAn = deleteTienAn(tienAnId);

		if(Validator.isNotNull(tienAn)) {
			long doiTuongTienAnId = tienAn.getDoiTuongTienAnId();
			DoiTuongTienAn doiTuongTienAn = doiTuongTienAnLocalService.findByDoiTuongTienAnId(doiTuongTienAnId);

			PhieuThongTinVeNguoiCoTienAn phieu = phieuThongTinVeNguoiCoTienAnLocalService.findByTienAnId(tienAnId);

			/*
			 * sava data for undo & redo action
			 */
			saveDataForUndoRedo(undoRedo, thaoTac, tienAn, doiTuongTienAn, phieu);

			phieuThongTinVeNguoiCoTienAnLocalService.deletePhieuThongTinVeNguoiCoTienAn(phieu);

			if(doiTuongTienAnId > 0) {
				List<TienAn> tienAns = findByDoiTuongTienAnId(doiTuongTienAnId);

				if(Validator.isNull(tienAns) || tienAns.isEmpty()) {
					doiTuongTienAnLocalService.deleteDoiTuongTienAn(doiTuongTienAnId);
				} else {
					boolean isXoaAnTichForDoiTuong = true;
					for (TienAn ts : tienAns) {
						if((ts != tienAn) && !ts.isXoaAnTich()) {
							isXoaAnTichForDoiTuong = false;
						}
					}

					if(isXoaAnTichForDoiTuong) {
						doiTuongTienAn.setUserId(user.getUserId());
						doiTuongTienAn.setModifiedDate(new Date());
						doiTuongTienAn.setXoaAnTich(true);

						doiTuongTienAnLocalService.updateDoiTuongTienAn(doiTuongTienAn);
					}
				}
			}
		}
	}

	private void saveDataForUndoRedo(String undoRedo, String thaoTac,
			TienAn tienAn, DoiTuongTienAn doiTuongTienAn,
			PhieuThongTinVeNguoiCoTienAn phieu) throws SystemException {
		TEMP_DoiTuongTienAn doiTuongTienAnTemp = temp_DoiTuongTienAnLocalService.findBySoDinhDanhCaNhan(doiTuongTienAn.getSoDinhDanhCaNhan());

		if (Validator.isNull(doiTuongTienAnTemp)) {
			doiTuongTienAnTemp = temp_DoiTuongTienAnLocalService.addTEMP_DoiTuongTienAn(doiTuongTienAn.getUserId(), doiTuongTienAn.getUserName(),doiTuongTienAn.getSoDinhDanhCaNhan(), doiTuongTienAn.getDoiTuongTienAnId());
		}

		//xoa het nhung tien an truoc do
		temp_PhieuThongTinVeNguoiCoTienAnLocalService.xoaAllTempPhieuByDoiTuongTienAnId(doiTuongTienAnTemp.getDoiTuongTienAnId());
		temp_TienAnLocalService.xoaAllTempTienAn(doiTuongTienAnTemp.getDoiTuongTienAnId());

		TEMP_TienAn temptienan = temp_TienAnLocalService
				.addTEMP_TienAn(tienAn.getUserId(), tienAn.getUserName(),
						doiTuongTienAnTemp.getDoiTuongTienAnId(),
						tienAn.getBanAnSo(), tienAn.getToaAnXuPhat(), "",
						tienAn.getNgayToaAn(), tienAn.getToiDanh(),
						tienAn.getNgayPhamToi(), tienAn.getXoaAnTich(),
						tienAn.getChuThich(), tienAn.getHinhPhatChinh(),
						tienAn.getHinhPhatBoSung(),
						tienAn.getNghiaVuDanSu(), tienAn.getAnPhi(),
						tienAn.getMoTaTienAn(), undoRedo, thaoTac,
						tienAn.getTienAnId());

		temp_PhieuThongTinVeNguoiCoTienAnLocalService.addTEMPPhieu(
				temptienan.getTienAnId(), temptienan.getUserId(),
				temptienan.getUserName(), phieu.getMaSoHoSoTienAnTuToaAn(),
				phieu.getNguoiTrichLuc(), phieu.getThamPhan(),
				phieu.getSoDinhDanhCaNhan(), phieu.getChuThich(),
				phieu.getNoiTamTruDiaChi(), phieu.getHoTenVoHoacChong(),
				phieu.getHoTenCha(), phieu.getHoTenMe(),
				phieu.getNoiThuongTruDiaChi());
	}
}
